#include <57header.h>

int main(int argc,char*argv[])
{

    int pipe_write = open("1.pipe", O_WRONLY);
    int pipe_read = open("2.pipe", O_RDONLY);

    // 构建监听集合
    fd_set set;
    // 初始化文件描述符集合
    FD_ZERO(&set);

    while(1){
        // 把标准输入, 放入监听集合
        FD_SET(STDIN_FILENO, &set);
        // 把管道的读端放入监听集合
        FD_SET(pipe_read, &set);

        // 把文件描述符集合, 交给select, 监听这些集合中的文件描述符
        // 是否可读
        // 当至少有一个文件描述符变得可读, select就绪
        select(10, &set, NULL, NULL, NULL);
        // 因为上面的select是一直阻塞(超时时间为NULL)
        // 也就意味这, 只要select结束
        // -> 一定意味这刚才监听的两个文件描述符至少有一个就绪
        // 这个就绪的文件描述符, 依旧再set中


        // 判断set中(就绪集合中)是否存在标准输入的文件描述 
        if(FD_ISSET(STDIN_FILENO, &set)){
            // 走到这, 标准输入就绪可读
            char buf[60] = {0};
            bzero(buf, sizeof(buf));
            read(STDIN_FILENO, buf, sizeof(buf));
            write(pipe_write, buf, sizeof(buf));
        }

        // 判断是否是管道可读
        if(FD_ISSET(pipe_read, &set)){
            // 管道可读
            char buf[60] = {0}; 
            bzero(buf, sizeof(buf));
            int res = read(pipe_read, buf, sizeof(buf));
            if(res == 0){
                printf("对端关闭了管道 \n");
                break;
            }
            printf("B: %s \n", buf);
        }
    }

    close(pipe_read);
    close(pipe_write);

    return 0;
}

